home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / java / util / HashMap.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  7.3 KB  |  459 lines

  1. package java.util;
  2.  
  3. import java.io.IOException;
  4. import java.io.ObjectInputStream;
  5. import java.io.ObjectOutputStream;
  6. import java.io.Serializable;
  7.  
  8. public class HashMap<K, V> extends AbstractMap<K, V> implements Map<K, V>, Cloneable, Serializable {
  9.    static final int DEFAULT_INITIAL_CAPACITY = 16;
  10.    static final int MAXIMUM_CAPACITY = 1073741824;
  11.    static final float DEFAULT_LOAD_FACTOR = 0.75F;
  12.    transient Entry[] table;
  13.    transient int size;
  14.    int threshold;
  15.    final float loadFactor;
  16.    transient volatile int modCount;
  17.    private transient Set<Map.Entry<K, V>> entrySet;
  18.    private static final long serialVersionUID = 362498820763181265L;
  19.  
  20.    public HashMap(int var1, float var2) {
  21.       this.entrySet = null;
  22.       if (var1 < 0) {
  23.          throw new IllegalArgumentException("Illegal initial capacity: " + var1);
  24.       } else {
  25.          if (var1 > 1073741824) {
  26.             var1 = 1073741824;
  27.          }
  28.  
  29.          if (!(var2 <= 0.0F) && !Float.isNaN(var2)) {
  30.             int var3;
  31.             for(var3 = 1; var3 < var1; var3 <<= 1) {
  32.             }
  33.  
  34.             this.loadFactor = var2;
  35.             this.threshold = (int)((float)var3 * var2);
  36.             this.table = new Entry[var3];
  37.             this.init();
  38.          } else {
  39.             throw new IllegalArgumentException("Illegal load factor: " + var2);
  40.          }
  41.       }
  42.    }
  43.  
  44.    public HashMap(int var1) {
  45.       this(var1, 0.75F);
  46.    }
  47.  
  48.    public HashMap() {
  49.       this.entrySet = null;
  50.       this.loadFactor = 0.75F;
  51.       this.threshold = 12;
  52.       this.table = new Entry[16];
  53.       this.init();
  54.    }
  55.  
  56.    public HashMap(Map<? extends K, ? extends V> var1) {
  57.       this(Math.max((int)((float)var1.size() / 0.75F) + 1, 16), 0.75F);
  58.       this.putAllForCreate(var1);
  59.    }
  60.  
  61.    void init() {
  62.    }
  63.  
  64.    static int hash(int var0) {
  65.       var0 ^= var0 >>> 20 ^ var0 >>> 12;
  66.       return var0 ^ var0 >>> 7 ^ var0 >>> 4;
  67.    }
  68.  
  69.    static int indexFor(int var0, int var1) {
  70.       return var0 & var1 - 1;
  71.    }
  72.  
  73.    public int size() {
  74.       return this.size;
  75.    }
  76.  
  77.    public boolean isEmpty() {
  78.       return this.size == 0;
  79.    }
  80.  
  81.    public V get(Object var1) {
  82.       if (var1 == null) {
  83.          return (V)this.getForNullKey();
  84.       } else {
  85.          int var2 = hash(var1.hashCode());
  86.  
  87.          for(Entry var3 = this.table[indexFor(var2, this.table.length)]; var3 != null; var3 = var3.next) {
  88.             Object var4;
  89.             if (var3.hash == var2 && ((var4 = var3.key) == var1 || var1.equals(var4))) {
  90.                return (V)var3.value;
  91.             }
  92.          }
  93.  
  94.          return null;
  95.       }
  96.    }
  97.  
  98.    private V getForNullKey() {
  99.       for(Entry var1 = this.table[0]; var1 != null; var1 = var1.next) {
  100.          if (var1.key == null) {
  101.             return (V)var1.value;
  102.          }
  103.       }
  104.  
  105.       return null;
  106.    }
  107.  
  108.    public boolean containsKey(Object var1) {
  109.       return this.getEntry(var1) != null;
  110.    }
  111.  
  112.    final Entry<K, V> getEntry(Object var1) {
  113.       int var2 = var1 == null ? 0 : hash(var1.hashCode());
  114.  
  115.       for(Entry var3 = this.table[indexFor(var2, this.table.length)]; var3 != null; var3 = var3.next) {
  116.          Object var4;
  117.          if (var3.hash == var2 && ((var4 = var3.key) == var1 || var1 != null && var1.equals(var4))) {
  118.             return var3;
  119.          }
  120.       }
  121.  
  122.       return null;
  123.    }
  124.  
  125.    public V put(K var1, V var2) {
  126.       if (var1 == null) {
  127.          return (V)this.putForNullKey(var2);
  128.       } else {
  129.          int var3 = hash(var1.hashCode());
  130.          int var4 = indexFor(var3, this.table.length);
  131.  
  132.          for(Entry var5 = this.table[var4]; var5 != null; var5 = var5.next) {
  133.             Object var6;
  134.             if (var5.hash == var3 && ((var6 = var5.key) == var1 || var1.equals(var6))) {
  135.                Object var7 = var5.value;
  136.                var5.value = var2;
  137.                var5.recordAccess(this);
  138.                return (V)var7;
  139.             }
  140.          }
  141.  
  142.          ++this.modCount;
  143.          this.addEntry(var3, var1, var2, var4);
  144.          return null;
  145.       }
  146.    }
  147.  
  148.    private V putForNullKey(V var1) {
  149.       for(Entry var2 = this.table[0]; var2 != null; var2 = var2.next) {
  150.          if (var2.key == null) {
  151.             Object var3 = var2.value;
  152.             var2.value = var1;
  153.             var2.recordAccess(this);
  154.             return (V)var3;
  155.          }
  156.       }
  157.  
  158.       ++this.modCount;
  159.       this.addEntry(0, (Object)null, var1, 0);
  160.       return null;
  161.    }
  162.  
  163.    private void putForCreate(K var1, V var2) {
  164.       int var3 = var1 == null ? 0 : hash(var1.hashCode());
  165.       int var4 = indexFor(var3, this.table.length);
  166.  
  167.       for(Entry var5 = this.table[var4]; var5 != null; var5 = var5.next) {
  168.          Object var6;
  169.          if (var5.hash == var3 && ((var6 = var5.key) == var1 || var1 != null && var1.equals(var6))) {
  170.             var5.value = var2;
  171.             return;
  172.          }
  173.       }
  174.  
  175.       this.createEntry(var3, var1, var2, var4);
  176.    }
  177.  
  178.    private void putAllForCreate(Map<? extends K, ? extends V> var1) {
  179.       for(Map.Entry var3 : var1.entrySet()) {
  180.          this.putForCreate(var3.getKey(), var3.getValue());
  181.       }
  182.  
  183.    }
  184.  
  185.    void resize(int var1) {
  186.       Entry[] var2 = this.table;
  187.       int var3 = var2.length;
  188.       if (var3 == 1073741824) {
  189.          this.threshold = Integer.MAX_VALUE;
  190.       } else {
  191.          Entry[] var4 = new Entry[var1];
  192.          this.transfer(var4);
  193.          this.table = var4;
  194.          this.threshold = (int)((float)var1 * this.loadFactor);
  195.       }
  196.    }
  197.  
  198.    void transfer(Entry[] var1) {
  199.       Entry[] var2 = this.table;
  200.       int var3 = var1.length;
  201.  
  202.       for(int var4 = 0; var4 < var2.length; ++var4) {
  203.          Entry var5 = var2[var4];
  204.          if (var5 != null) {
  205.             var2[var4] = null;
  206.  
  207.             while(true) {
  208.                Entry var6 = var5.next;
  209.                int var7 = indexFor(var5.hash, var3);
  210.                var5.next = var1[var7];
  211.                var1[var7] = var5;
  212.                var5 = var6;
  213.                if (var6 == null) {
  214.                   break;
  215.                }
  216.             }
  217.          }
  218.       }
  219.  
  220.    }
  221.  
  222.    public void putAll(Map<? extends K, ? extends V> var1) {
  223.       int var2 = var1.size();
  224.       if (var2 != 0) {
  225.          if (var2 > this.threshold) {
  226.             int var3 = (int)((float)var2 / this.loadFactor + 1.0F);
  227.             if (var3 > 1073741824) {
  228.                var3 = 1073741824;
  229.             }
  230.  
  231.             int var4;
  232.             for(var4 = this.table.length; var4 < var3; var4 <<= 1) {
  233.             }
  234.  
  235.             if (var4 > this.table.length) {
  236.                this.resize(var4);
  237.             }
  238.          }
  239.  
  240.          for(Map.Entry var6 : var1.entrySet()) {
  241.             this.put(var6.getKey(), var6.getValue());
  242.          }
  243.  
  244.       }
  245.    }
  246.  
  247.    public V remove(Object var1) {
  248.       Entry var2 = this.removeEntryForKey(var1);
  249.       return (V)(var2 == null ? null : var2.value);
  250.    }
  251.  
  252.    final Entry<K, V> removeEntryForKey(Object var1) {
  253.       int var2 = var1 == null ? 0 : hash(var1.hashCode());
  254.       int var3 = indexFor(var2, this.table.length);
  255.       Entry var4 = this.table[var3];
  256.  
  257.       Entry var5;
  258.       Entry var6;
  259.       for(var5 = var4; var5 != null; var5 = var6) {
  260.          var6 = var5.next;
  261.          Object var7;
  262.          if (var5.hash == var2 && ((var7 = var5.key) == var1 || var1 != null && var1.equals(var7))) {
  263.             ++this.modCount;
  264.             --this.size;
  265.             if (var4 == var5) {
  266.                this.table[var3] = var6;
  267.             } else {
  268.                var4.next = var6;
  269.             }
  270.  
  271.             var5.recordRemoval(this);
  272.             return var5;
  273.          }
  274.  
  275.          var4 = var5;
  276.       }
  277.  
  278.       return var5;
  279.    }
  280.  
  281.    final Entry<K, V> removeMapping(Object var1) {
  282.       if (!(var1 instanceof Map.Entry)) {
  283.          return null;
  284.       } else {
  285.          Map.Entry var2 = (Map.Entry)var1;
  286.          Object var3 = var2.getKey();
  287.          int var4 = var3 == null ? 0 : hash(var3.hashCode());
  288.          int var5 = indexFor(var4, this.table.length);
  289.          Entry var6 = this.table[var5];
  290.  
  291.          Entry var7;
  292.          Entry var8;
  293.          for(var7 = var6; var7 != null; var7 = var8) {
  294.             var8 = var7.next;
  295.             if (var7.hash == var4 && var7.equals(var2)) {
  296.                ++this.modCount;
  297.                --this.size;
  298.                if (var6 == var7) {
  299.                   this.table[var5] = var8;
  300.                } else {
  301.                   var6.next = var8;
  302.                }
  303.  
  304.                var7.recordRemoval(this);
  305.                return var7;
  306.             }
  307.  
  308.             var6 = var7;
  309.          }
  310.  
  311.          return var7;
  312.       }
  313.    }
  314.  
  315.    public void clear() {
  316.       ++this.modCount;
  317.       Entry[] var1 = this.table;
  318.  
  319.       for(int var2 = 0; var2 < var1.length; ++var2) {
  320.          var1[var2] = null;
  321.       }
  322.  
  323.       this.size = 0;
  324.    }
  325.  
  326.    public boolean containsValue(Object var1) {
  327.       if (var1 == null) {
  328.          return this.containsNullValue();
  329.       } else {
  330.          Entry[] var2 = this.table;
  331.  
  332.          for(int var3 = 0; var3 < var2.length; ++var3) {
  333.             for(Entry var4 = var2[var3]; var4 != null; var4 = var4.next) {
  334.                if (var1.equals(var4.value)) {
  335.                   return true;
  336.                }
  337.             }
  338.          }
  339.  
  340.          return false;
  341.       }
  342.    }
  343.  
  344.    private boolean containsNullValue() {
  345.       Entry[] var1 = this.table;
  346.  
  347.       for(int var2 = 0; var2 < var1.length; ++var2) {
  348.          for(Entry var3 = var1[var2]; var3 != null; var3 = var3.next) {
  349.             if (var3.value == null) {
  350.                return true;
  351.             }
  352.          }
  353.       }
  354.  
  355.       return false;
  356.    }
  357.  
  358.    public Object clone() {
  359.       HashMap var1 = null;
  360.  
  361.       try {
  362.          var1 = (HashMap)super.clone();
  363.       } catch (CloneNotSupportedException var3) {
  364.       }
  365.  
  366.       var1.table = new Entry[this.table.length];
  367.       var1.entrySet = null;
  368.       var1.modCount = 0;
  369.       var1.size = 0;
  370.       var1.init();
  371.       var1.putAllForCreate(this);
  372.       return var1;
  373.    }
  374.  
  375.    void addEntry(int var1, K var2, V var3, int var4) {
  376.       Entry var5 = this.table[var4];
  377.       this.table[var4] = new Entry(var1, var2, var3, var5);
  378.       if (this.size++ >= this.threshold) {
  379.          this.resize(2 * this.table.length);
  380.       }
  381.  
  382.    }
  383.  
  384.    void createEntry(int var1, K var2, V var3, int var4) {
  385.       Entry var5 = this.table[var4];
  386.       this.table[var4] = new Entry(var1, var2, var3, var5);
  387.       ++this.size;
  388.    }
  389.  
  390.    Iterator<K> newKeyIterator() {
  391.       return new KeyIterator(this, (1)null);
  392.    }
  393.  
  394.    Iterator<V> newValueIterator() {
  395.       return new ValueIterator(this, (1)null);
  396.    }
  397.  
  398.    Iterator<Map.Entry<K, V>> newEntryIterator() {
  399.       return new EntryIterator(this, (1)null);
  400.    }
  401.  
  402.    public Set<K> keySet() {
  403.       Set var1 = this.keySet;
  404.       return var1 != null ? var1 : (this.keySet = new KeySet(this, (1)null));
  405.    }
  406.  
  407.    public Collection<V> values() {
  408.       Collection var1 = this.values;
  409.       return var1 != null ? var1 : (this.values = new Values(this, (1)null));
  410.    }
  411.  
  412.    public Set<Map.Entry<K, V>> entrySet() {
  413.       return this.entrySet0();
  414.    }
  415.  
  416.    private Set<Map.Entry<K, V>> entrySet0() {
  417.       Set var1 = this.entrySet;
  418.       return var1 != null ? var1 : (this.entrySet = new EntrySet(this, (1)null));
  419.    }
  420.  
  421.    private void writeObject(ObjectOutputStream var1) throws IOException {
  422.       Iterator var2 = this.size > 0 ? this.entrySet0().iterator() : null;
  423.       var1.defaultWriteObject();
  424.       var1.writeInt(this.table.length);
  425.       var1.writeInt(this.size);
  426.       if (var2 != null) {
  427.          while(var2.hasNext()) {
  428.             Map.Entry var3 = (Map.Entry)var2.next();
  429.             var1.writeObject(var3.getKey());
  430.             var1.writeObject(var3.getValue());
  431.          }
  432.       }
  433.  
  434.    }
  435.  
  436.    private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
  437.       var1.defaultReadObject();
  438.       int var2 = var1.readInt();
  439.       this.table = new Entry[var2];
  440.       this.init();
  441.       int var3 = var1.readInt();
  442.  
  443.       for(int var4 = 0; var4 < var3; ++var4) {
  444.          Object var5 = var1.readObject();
  445.          Object var6 = var1.readObject();
  446.          this.putForCreate(var5, var6);
  447.       }
  448.  
  449.    }
  450.  
  451.    int capacity() {
  452.       return this.table.length;
  453.    }
  454.  
  455.    float loadFactor() {
  456.       return this.loadFactor;
  457.    }
  458. }
  459.